package org.example.day02;

/**
 * @author zlxad
 * @version 1.0
 * @description: TODO
 * <div>  Wonderland是小王居住地一家很受欢迎的游乐园。 Wonderland目前有4种售票方式，分别为一日票（1天）、三日票（3天）、周票（7天）和月票（30天）。 </div> <div>  <br> </div> <div>  每种售票方式的价格将由一个数组给出，每种票据在票面时限内可以无限制的进行游玩。例如，小王在第10日买了一张三日票，小王可以在第10日、第11日和第12日进行无限制的游玩。  </div> <div>  <br> </div> <div>  小王计划在接下来一年内多次游玩该游乐园。小王计划的游玩日期将由一个数组给出。 现在，请您根据给出的售票价格数组和小王计划游玩日期数组，返回完成游玩计划所需要的最低消费。 </div> <div>  <br> </div>
 *
 * Wonderland是小王居住地一家很受欢迎的游乐园。 Wonderland目前有4种售票方式，分别为一日票（1天）、三日票（3天）、周票（7天）和月票（30天）。
 * 每种售票方式的价格将由一个数组给出，每种票据在票面时限内可以无限制的进行游玩。例如，小王在第10日买了一张三日票，小王可以在第10日、第11日和第12日进行无限制的游玩。
 * 小王计划在接下来一年内多次游玩该游乐园。小王计划的游玩日期将由一个数组给出。 现在，请您根据给出的售票价格数组和小王计划游玩日期数组，返回完成游玩计划所需要的最低消费。
 * @date 2024/3/11 15:22
 */
public class test037 {
    public static int minCost(int[] prices, int[] days) {
        int[] dp = new int[days[days.length - 1] + 1]; // dp数组存储到每一天为止的最低消费

        for (int i = 1; i < dp.length; i++) {
            // 如果当前日期不在计划的游玩日期中，则最低消费和前一天一样
            if (!contains(days, i)) {
                dp[i] = dp[i - 1];
                continue;
            }

            // 初始化当前日期的最低消费为三日票价格
            dp[i] = dp[i - 1] + prices[0];

            // 计算一日票、三日票、周票和月票中的最低价格
            dp[i] = Math.min(dp[i], dp[Math.max(0, i - 1)] + prices[1]);
            dp[i] = Math.min(dp[i], dp[Math.max(0, i - 3)] + prices[2]);
            dp[i] = Math.min(dp[i], dp[Math.max(0, i - 7)] + prices[3]);
            dp[i] = Math.min(dp[i], dp[Math.max(0, i - 30)] + prices[4]);
        }

        return dp[days[days.length - 1]]; // 返回最后一天的最低消费
    }

    // 判断给定数组中是否包含某个数字
    public static boolean contains(int[] arr, int target) {
        for (int num : arr) {
            if (num == target) {
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        int[] prices = {0, 2, 7, 15, 45}; // 分别为一日票、三日票、周票和月票的价格
        int[] days = {1, 4, 6, 7, 8, 20}; // 小王计划的游玩日期

        int minCost = minCost(prices, days);
        System.out.println("完成游玩计划所需的最低消费：" + minCost);
    }
}